// package emittable

// import chisel3._
// import chisel3.util.experimental._
// import chiseltest._
// import chiseltest.formal._
// import chiseltest.experimental._
// import chisel3.stage.{ChiselStage, ChiselGeneratorAnnotation}

// import firrtl._

// abstract class EmittedCircuit extends EmittedComponent
// abstract class EmittedModule extends EmittedComponent

// trait EmittedCircuitAnnotation[T <: EmittedCircuit] extends EmittedAnnotation[T] {
//   override def getBytes = value.value.getBytes
// }

// trait EmittedModuleAnnotation[T <: EmittedModule] extends EmittedAnnotation[T] {
//   override def getBytes = value.value.getBytes
// }

// case class EmittedSpecCircuitAnnotation(value: EmittedCircuit) extends EmittedCircuitAnnotation[EmittedCircuit]
// case class EmittedSpecModuleAnnotation(value: EmittedModule) extends EmittedModuleAnnotation[EmittedModule]

// trait Emittable {
//   def emit (form:String, gen: => RawModule): String =
//       (new ChiselStage)
//         .execute(
//           Array("--emit-circuit", form), 
//           Seq(ChiselGeneratorAnnotation(() => gen))
//         )
//         .collectFirst{
//           case EmittedSpecCircuitAnnotation(a) => a
//           case EmittedSpecModuleAnnotation(a) => a
//         }
//         .map(_.value)
//         .mkString("")
// }